package datestructuresjava.danlianbiao;

public class SingleLinkeList {
        //定义SingleLinkedList

        //定义头结点 位置保持不变
        private HeroNode head=new HeroNode(0,"","");
//        private int N;

        /**
         * 1.找到当前链表的最后节点
         * 2.将这个节点的next 指向下一个节点
         *
         * @param heroNode
         */
        //添加节点
        public void add(HeroNode heroNode) {
            //定义辅助变量指向头节点
            HeroNode temp = head;
            //找到当前链表的最后节点 需要遍历
            while (true) {
                //判断是否存在下一个节点
                if (temp.next == null) {
                    break;
                }
                //如果没有找到temp后移
                temp = temp.next;
            }
            //将最后这个节点的next 指向新节点
            temp.next = heroNode;
        }

        public void addByOrder(HeroNode heroNode) {
            //找到添加节点的位置  应该是在 辅助变量和辅助变量.next 中间
            //找到了位置以后
            //temp.next = heroNode;
            //heroNode.next = temp.next;
            //我们找到的temp,是位于添加位置的前一个节点
            HeroNode temp = head;
            boolean flag = false;//定义标记 表示是否重复添加英雄
            while (true) {
                if (temp.next == null) {
                    break;
                }
                if (temp.next.no > heroNode.no) {
                    break;
                } else if (temp.next.no == heroNode.no) {//重复添加英雄
                    //将标记符置位true
                    flag = true;
                    break;
                }
                //后移
                temp = temp.next;
            }
            if (flag) {
                System.out.printf("准备添加%d号的英雄,已存在不能加入\n", heroNode.no);
            }
            //插入链表 temp的后面
            heroNode.next = temp.next;
            temp.next = heroNode;
        }

        /**
         * 修改单链表的数据信息
         * 1.找到要修改的数据的前一个节点
         * 2.只能修改节点的姓名和昵称 不能修改节点的编号如果要修改成了添加一个节点
         */
        public void update(HeroNode newHeroNode) {
            //判断是否为空
            if (head.next == null) {
                System.out.println("链表为空");
                return;
            }
            //辅助变量
            HeroNode temp = head.next;
            boolean flag = false;//标记是找到修改的节点
            //循环判断是否存在要修改的节点信息
            while (true) {
                if (temp == null) {
                    break;
                }
                if (temp.no == newHeroNode.no) {
                    flag = true;
                    break;
                }
                //如果上述条件都不满足,则继续循环遍历查找要修改的节点
                temp = temp.next;
            }
            //判断标记是否为true
            if (flag) {
                temp.name = newHeroNode.name;
                temp.nickname = newHeroNode.nickname;
            } else {
                System.out.printf("要修改的节点%d号,不存在\n", newHeroNode.no);
            }
        }

        /**
         * 删除节点信息
         * 思路:
         * 1.找到需要删除节点的位置
         * 2.删除节点后需要将删除节点的前一个节点与后一个节点连接起来
         * temp.next == temp.next.next;
         */
        public void delete(int no) {
            //辅助变量
            HeroNode temp = head;
            boolean flag = false;
            //循环遍历找出需要删除的节点位置
            while (true) {
                if (temp.next == null) {
                    break;
                }
                if (temp.next.no == no) {
                    flag = true;
                    break;
                }
                //后移继续查找要删除节点的位置
                temp = temp.next;
            }
            if (flag) {
                temp.next = temp.next.next;
            } else {
                System.out.printf("要删除的节点%d号,不存在", no);
            }
        }


        //显示链表[遍历]

        public void list() {
            //判断链表是否为空
            HeroNode temp = head.next;
            if (temp == null) {
                System.out.print("链表为空");
                return;
            }
            //因为头节点不能动，需要一个辅助变量来遍历
            while (temp !=null) {
                //判断是否到链表最后
                //输出节点信息
                System.out.println(temp);
                //循环完第一个节点后应该 指向下一个节点
                temp = temp.next;

            }
        }
//    public void list() {
//        StudentNode temp = head.next;
//        if (temp == null) {
//            System.out.println("链表为空");
//            return;
//        }
//        // 当节点的地址域不为空时，一直遍历打印节点数据，temp为空时跳出循环
//        while (temp != null) {
//            System.out.println(temp);
//            // 指针后移，继续遍历
//            temp = temp.next;
//        }
//
//    }

        //clear清空链表
        public void clear(){
            this.head=null;
//            this.N=0;
        }

        //获取链表长度
//        public int length(){
//            return N;
//        }

        //获取指定节点的数据





}
